![]() | CONTINUACIONES (CONTINUATION- PASSING STYLE, CPS) |
f(x c)
siendo:
x
: parámetro(s) de la función f
.
c
: función continuación.
〈( f(x c) = c(f(x)) )〉
〈( cuadrado(x) = x*x )〉
cuadrado(4) // ev. 4*4 ev. 16
〈( cuadrado(x c) = c(x*x) )〉
〈( sumar5(x) = x+5 )〉
cuadrado(4 sumar5) // ev. sumar5(4*4) ev. sumar5(16) ev. 16+5 ev. 21
〈( prod5(x) = 5*x )〉
cuadrado(4 prod5) // ev. prod5(4*4) ev. prod5(16) ev. 5*16 ev. 80
c
representa a una función de cualquier número de parámetros. Por ejemplo, generalizando el ejemplo anterior mediante un parámetro,
〈( sumar(n)(x) = x+n )〉
cuadrado(4 sumar(23)) // ev. sumar(23)(4*4) ev. 16+23 ev. 39
〈( lineal(a b)(x) = (a*x + b) )〉
cuadrado(4 lineal(2 5)) // ev. lineal(2 5)(4*4) ev. 2*16 + 5 ev. 37
〈( cuadrado(x c) = c(x*x) )〉
θ
), tenemos, por ejemplo:
cuadrado(4 θ) // ev. cuadrado(4)
(u=7 v=2 w=5)
〈( fun(x c) = c(x + w) )〉 // ligadas: x, c libres: w
〈( cont(x) = (u*x + v) )〉 // ligadas: x libres: u, v
fun(4 cont) // ev. cont(4+5) ev. cont(9) ev. (7*9 + 2) ev. 65
〈( fac(n) = (1 ← n=1 →' n*fac(n−1)) )〉
fac(4) // ev. 4*3*2*1 ev. 24
〈( facx(n c) = (c(fac(n)) )〉
〈( lineal(a b)(x) = (a*x + b) )〉
facx(4 lineal(2 5)) // ev. lineal(2 5)(24) ev. 224+5 ev. 53
〈( fibo(n) = (1 ← n>2 →' (fibo(n−1) + fibo(n−2))) )〉
fibo(1) // ev. 1
fibo(2) // ev. 1
fibo(3) // ev. 2
fibo(4) // ev. 3
fibo(5) // ev. 5
...
〈( fibox(n c) = c(fibo(n)) )〉
〈( doble(x) = 2*x )〉
fibox(1 doble) // ev. doble(1) ev. 2
fibox(2 doble) // ev. doble(1) ev. 2
fibox(3 doble) // ev. doble(2) ev. 4
fibox(4 doble) // ev. doble(3) ev. 6
fibox(5 doble) // ev. doble(5) ev. 10
...
〈( f(x c1 c2) = c2(c1(f(x))) )〉
〈( cuadrado(x c1 c2) = c1(x*x c2)) )〉 // eq.
〈( cuadrado(x c1 c2) = c2(c1(x*x)) )〉
c1:
〈( sumar5(x) = x+5 )〉
c2
:
〈( prod3(x) = 3*x) )〉
cuadrado(4 sumar5 prod3)) // ev. prod3(sumar5(4*4)) // ev. prod3(16+5) ev. prod3(21) ev. 63
〈( fac(n c) = (c(1) ← n=1 →' c(n)*fac(n−1 c))) )〉
fac(1 c) // ev. c(1)
fac(2 c) // ev. c(2)*c(1)
fac(3 c) // ev. c(3)*c(2)*c(1)
...
c=θ
, tenemos la función factorial normal.
〈( doble(x) = x*2 )〉
, tenemos:
fac(1 doble) // ev. doble(1) ev. 2
fac(2 doble) // ev. doble(2)*doble(1) ev. 4*2 ev. 8
fac(3 doble) // ev. doble(3) * doble(2) * doble(1) ev. 6*4*2 ev. 48
...
〈( fibo(n c) = (c(1) ← n>2 →' c(fibo(n−1 c) + fibo(n−2 c)))) )〉
fibo(1 c) // ev. c(1)
fibo(2 c) // ev. c(1)
fibo(3 c) // ev. c(fibo(2 c) + fibo(1 c)) ev. c(2*c(1))
fibo(4 c) // ev. c(fibo(3 c) + fibo(2 c)) ev. c(c(2*c(1)) + c(1))
...
c=θ
, tenemos la función de Fibonacci normal.
doble
) como c
, tenemos:
fibo(1 doble) // ev. doble(1) ev. 2
fibo(2 doble) // ev. doble(1) ev. 2
fibo(3 doble) // ev. doble(2 + 2) ev. 8
fibo(4 doble) // ev. doble(2 + 8) ev. 20
...
〈(unodos(c) = c(12))〉
〈(doble(x) = 2*x)〉
unodos(doble) // ev. 2*12 ev. 24
unodos(123) // ev. 123(12)
〈( registro(c) = (c(6) c(12) c(9) c(17) c(8)) )〉
〈( selec(n)(x) = (x<n → x) )〉 // selecciona x si menor que n
registro(selec(10)) // ev. (6 9 8)
registro(abc)) // ev. (abc(6) abc(12) abc(9) abc(17) abc(8))
〈( registro(c) = (6 12 9 17 8)c )〉
〈( selec(s)(x) = ( x⇓s ) )〉 // s es el criterio de selección
registro(selec(>9)) // ev. (6 12 9 17 8)⇓(>9) ev. (12 17)
registro(u v w) // ev. (6 12 9 17 8)(u v w)
f
es fijo (no puede ser variable). En MENTAL, sí puede ser variable, por lo que el concepto de continuación es irrelevante, pues da lo mismo incluir la continuación como parámetro o como función. Por ejemplo,
〈( cuadrado(x) = x*x )〉
〈( doble(x) = x*2 )〉
〈( f(x c) = c(f(x) )〉
(f = cuadrado)
f(5 c) // ev. cuadrado(5 c)) ev. c(cuadrado(5)) ev. c(25)
(c = cuadrado)
f(5 c) // ev. f(5 cuadrado) ev. cuadrado(f(5)) ev. f(5)*f(5)
(f = cuadrado)
(c = doble)
f(5 c) // ev. cuadrado(5 doble) ev. doble(cuadrado(5)) ev. doble(25) ev. 50
(f1(a1 c1) f2(a2 c2) f3(a3 c3) …)
fi
: función con continuación
ai
: argumento(s)
ci
: continuación